require "import"
import "android.widget.GridView"
import "android.content.Context"
import "android.content.Intent"
import "java.util.Locale"
import "android.speech.SpeechRecognizer"
import "android.speech.RecognitionListener"
import "android.speech.RecognizerIntent"
import "java.util.Locale"
import "android.content.Intent"
import "android.preference.PreferenceManager"

function kill()
  speechRecognizer.destroy()
  speechRecognizer = nil
  return true
end

function l()
  local languageCodes = {
    ["Arabic"] = "ar",
}

  local selectedLanguage = nil
  local items = {}

  for lang, _ in pairs(languageCodes) do
    items[#items + 1] = lang
  end

  local layout = {
    GridView,
    id = "grid",
    numColumns = 1,
    layout_width = "fill",
    layout_height = "fill"
  }

  local dlg = LuaDialog(this)
  dlg.View = loadlayout(layout)
  grid.adapter = SingleLineAdapter(service, items)

  -- Check if language has been selected before
  local sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this)
  local storedLanguage = sharedPrefs.getString("selectedLanguage", nil)
  if storedLanguage and languageCodes[storedLanguage] then
    selectedLanguage = storedLanguage
   else
    dlg.setTitle("Voice Dictation, v2.0")
  end

  dlg.setButton("Exit", nil)
  .show()

  grid.onItemClick = function(l, v)
    dlg.dismiss()
    task(500, function()
      local language = v.text
      languageCode = languageCodes[language]

      if languageCode then
        selectedLanguage = language -- Update the selected language
        -- Save the selected language to shared preferences
        local editor = sharedPrefs.edit()
        editor.putString("selectedLanguage", selectedLanguage)
        editor.apply()
        service.speak(language.. " language selected")
      end
    end)
  end
end
-- l functionமுடிவு

if speechRecognizer then
  kill()
  l()
 else

  local substitutionTable = {
    ["chino"] = "Jieshuo"
  }

  function hasInternetConnection()
    local connectivityManager = this.getSystemService(Context.CONNECTIVITY_SERVICE)
    local networkInfo = connectivityManager.getActiveNetworkInfo()
    return networkInfo ~= nil and networkInfo.isConnected()
  end

  function kill()
    speechRecognizer.destroy()
    speechRecognizer = nil
    return true
  end

  function startListening()
    if not hasInternetConnection() then
      service.asyncSpeak("இணைய இணைப்பு இல்லை.இணைய இணைப்பை சரி பார்த்த பிறகு  மீண்டும் முயலவும்.")
      return false
    end

    local verbalizationDetected = false

    speechRecognizer = SpeechRecognizer.createSpeechRecognizer(this)

    speechListener = RecognitionListener{
      onResults = function(results)
        data = results.getParcelableArrayList(SpeechRecognizer.RESULTS_RECOGNITION)
        if data ~= nil and data.size() > 0 then
          verbalizationDetected = true
          local recognizedText = data.get(0)
          local node = service.getEditText()
          local editText = service.getText(node)

          if editText and string.len(editText) > 0 then
            recognizedText = " " .. recognizedText
          end


          service.insertText(node, recognizedText)
          service.speak(recognizedText)
          kill()
        end

        if not verbalizationDetected then
          kill()
          return false
        end
      end,
      onError = function()
        kill()
        return false
      end
    }

    recognizerIntent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH)
    recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM)
    recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, languageCode)
    recognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, this.getPackageName())

    speechRecognizer.startListening(recognizerIntent)
    speechRecognizer.setRecognitionListener(speechListener)

    return true
  end

  startListening()
  return true
end